#pragma once
#include <iostream>
#include <Log.h>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>


#define MAX_LISTEN 1024

namespace muduo{
    class Socket{
    private:
        int _sock;
    public:
        Socket();
        Socket(int sock);
        ~Socket();
        // 获取套接字
        int Fd();
        // 创建套接字
        bool CreateSock();
        // 绑定地址信息
        bool Bind(const std::string& ip,uint16_t port);
        // 监听套接字
        bool Listen(int backlog);
        // 获取新连接
        int Accept();
        // 客户端发起连接
        bool Connect(const std::string& ip,uint16_t port);
        // 接受数据
        ssize_t Recv(void* buf,size_t len,int flag=0);
        // 发送数据
        ssize_t Send(const void* buf,size_t len,int flag=0);
        // 非阻塞接受数据
        ssize_t NonBlockRecv(void* buf,size_t len);
        // 非阻塞发送数据
        ssize_t NonBlockSend(void* buf,size_t len);
        // 创建服务器连接
        bool CreateServer(uint16_t port,const std::string& ip="0.0.0.0",bool flag_block=false);
        // 创建客户端连接
        bool CreateClient(uint16_t port,const std::string& ip);
        // 关闭套接字
        void Close();
        // 设置地址端口重用
        void ReuseAddress();
        // 将套接字设置为非阻塞
        void SetNonBlock();
    };
}
